#!/usr/bin/env python3
"""
WMS服务配置管理工具打包脚本
按照PyInstaller打包完整指南的最佳实践
"""

import os
import sys
import shutil
import subprocess
from pathlib import Path
from datetime import datetime

def cleanup_build_files():
    """清理构建文件"""
    dirs_to_clean = ['build', 'dist', '__pycache__']
    for dir_name in dirs_to_clean:
        if Path(dir_name).exists():
            shutil.rmtree(dir_name)
            print(f"✓ 清理: {dir_name}")

def verify_environment():
    """验证环境"""
    print("环境验证:")
    
    # 检查虚拟环境
    if 'clean_env_new' in sys.executable:
        print("✅ 使用干净的虚拟环境")
    else:
        print("⚠️ 建议使用干净的虚拟环境")
    
    # 检查必要依赖
    required_packages = ['pyinstaller', 'pywin32', 'tkinter']
    for package in required_packages:
        try:
            if package == 'tkinter':
                import tkinter
            else:
                __import__(package)
            print(f"✅ {package} 已安装")
        except ImportError:
            print(f"❌ {package} 未安装")
            return False
    
    return True

def build_executable():
    """构建可执行文件"""
    try:
        print("正在打包...")
        cmd = ['pyinstaller', '--clean', 'service_config_manager.spec']
        
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✅ 打包成功")
            return True
        else:
            print("❌ 打包失败")
            print("错误输出:", result.stderr)
            return False
            
    except Exception as e:
        print(f"❌ 打包异常: {e}")
        return False

def verify_executable():
    """验证可执行文件"""
    exe_path = Path("dist/service_config_manager/service_config_manager.exe")
    
    if not exe_path.exists():
        print("❌ 可执行文件不存在")
        return False
    
    # 检查文件大小
    size_mb = exe_path.stat().st_size / (1024 * 1024)
    print(f"✅ 可执行文件大小: {size_mb:.1f}MB")
    
    # 检查依赖目录
    internal_dir = exe_path.parent / "_internal"
    if internal_dir.exists():
        print("✅ 依赖目录存在")
    else:
        print("❌ 依赖目录缺失")
        return False
    
    return True

def create_deployment_package():
    """创建部署包"""
    timestamp = datetime.now().strftime("%y%m%d%H_%H%M")
    package_name = f"WMS_ServiceManager_v2.1.0_Production_{timestamp}"
    deployment_dir = Path("deployments") / package_name
    
    print(f"创建部署包: {package_name}")
    
    # 创建部署目录
    deployment_dir.mkdir(parents=True, exist_ok=True)
    
    # 复制主程序
    src_dir = Path("dist/service_config_manager")
    if src_dir.exists():
        # 复制整个目录
        for item in src_dir.iterdir():
            if item.is_file():
                shutil.copy2(item, deployment_dir)
            else:
                shutil.copytree(item, deployment_dir / item.name, dirs_exist_ok=True)
        print("✓ 复制主程序")
    
    # 复制配置文件
    config_files = ['config.json', 'client_config.json']
    for config_file in config_files:
        if Path(config_file).exists():
            shutil.copy2(config_file, deployment_dir)
            print(f"✓ 复制配置: {config_file}")
    
    # 复制数据目录
    data_dirs = ['data', 'logs', 'src']
    for data_dir in data_dirs:
        if Path(data_dir).exists():
            shutil.copytree(data_dir, deployment_dir / data_dir, dirs_exist_ok=True)
            print(f"✓ 复制目录: {data_dir}")
    
    # 创建启动脚本
    create_startup_scripts(deployment_dir)
    
    # 创建说明文档
    create_documentation(deployment_dir)
    
    print(f"✅ 部署包创建成功: {package_name}")
    return deployment_dir

def create_startup_scripts(deployment_dir):
    """创建启动脚本"""
    
    # Windows启动脚本
    start_script = deployment_dir / "启动服务管理工具.bat"
    with open(start_script, 'w', encoding='gbk') as f:
        f.write("""@echo off
chcp 65001 >nul
title WMS服务配置管理工具
echo 正在启动WMS服务配置管理工具...
service_config_manager.exe
if errorlevel 1 (
    echo 程序异常退出
    pause
)
""")
    
    # 系统检查脚本
    check_script = deployment_dir / "系统检查.bat"
    with open(check_script, 'w', encoding='gbk') as f:
        f.write("""@echo off
chcp 65001 >nul
title 系统检查
echo 正在检查系统文件...
echo.

if exist service_config_manager.exe (
    echo [OK] 主程序存在
) else (
    echo [ERROR] 主程序不存在
)

if exist _internal (
    echo [OK] 依赖目录存在
) else (
    echo [ERROR] 依赖目录不存在
)

if exist config.json (
    echo [OK] 配置文件存在
) else (
    echo [WARNING] 配置文件不存在
)

echo.
echo 检查完成
pause
""")
    
    print("✓ 创建启动脚本")

def create_documentation(deployment_dir):
    """创建说明文档"""
    
    readme_file = deployment_dir / "使用说明.md"
    with open(readme_file, 'w', encoding='utf-8') as f:
        f.write("""# WMS服务配置管理工具 使用说明

## 功能介绍
本工具用于在Windows服务器上安装、配置和管理WMS仓库管理系统服务。

## 安装步骤
1. 将整个文件夹复制到目标服务器
2. 双击运行"系统检查.bat"验证文件完整性
3. 以管理员身份运行"启动服务管理工具.bat"

## 文件说明
```
├── service_config_manager.exe    # 主程序
├── _internal/                    # 程序依赖文件（不要删除）
├── config.json                   # 主配置文件
├── client_config.json            # 客户端配置
├── data/                         # 数据目录
├── logs/                         # 日志目录
├── src/                          # 源代码模块
├── 启动服务管理工具.bat          # 启动脚本
├── 系统检查.bat                  # 系统检查脚本
└── 使用说明.md                   # 本文件
```

## 使用方法
1. **安装服务**: 点击"安装服务"按钮，工具会自动检测WMS服务程序
2. **启动服务**: 点击"启动服务"按钮
3. **停止服务**: 点击"停止服务"按钮
4. **卸载服务**: 点击"卸载服务"按钮

## 注意事项
- 必须以管理员权限运行
- 不要单独移动exe文件，保持所有文件在同一目录
- 确保WMS主程序已正确部署
- 如需修改配置，请编辑config.json文件

## 故障排除
- 如果提示"未找到WMS服务可执行文件"，请确保WMS主程序在同级或上级目录
- 如果服务安装失败，请检查是否以管理员权限运行
- 查看logs目录中的日志文件获取详细错误信息

## 技术支持
如遇问题，请联系开发团队。
""")
    
    print("✓ 创建说明文档")

def verify_deployment(deployment_dir):
    """验证部署包"""
    print("验证部署包:")
    
    checks = [
        ("主程序", deployment_dir / "service_config_manager.exe"),
        ("依赖目录", deployment_dir / "_internal"),
        ("启动脚本", deployment_dir / "启动服务管理工具.bat"),
        ("检查脚本", deployment_dir / "系统检查.bat"),
        ("说明文档", deployment_dir / "使用说明.md"),
    ]
    
    all_passed = True
    for name, path in checks:
        if path.exists():
            print(f"✅ {name}")
        else:
            print(f"❌ {name}")
            all_passed = False
    
    return all_passed

def main():
    """主函数"""
    print("=" * 60)
    print("WMS服务配置管理工具打包脚本")
    print("按照PyInstaller打包完整指南的最佳实践")
    print("=" * 60)
    
    # 1. 验证环境
    if not verify_environment():
        print("❌ 环境验证失败")
        return False
    
    # 2. 清理构建文件
    cleanup_build_files()
    
    # 3. 构建可执行文件
    if not build_executable():
        print("❌ 构建失败")
        return False
    
    # 4. 验证可执行文件
    if not verify_executable():
        print("❌ 可执行文件验证失败")
        return False
    
    # 5. 创建部署包
    deployment_dir = create_deployment_package()
    
    # 6. 验证部署包
    if not verify_deployment(deployment_dir):
        print("❌ 部署包验证失败")
        return False
    
    print("=" * 60)
    print("✅ 打包完成！")
    print(f"部署包位置: {deployment_dir}")
    print("=" * 60)
    
    return True

if __name__ == "__main__":
    success = main()
    if not success:
        sys.exit(1) 